home *** CD-ROM | disk | FTP | other *** search
/ Game Cracker (Expanded Edition) / Game Cracker (Expanded Edition).iso / cracks / SV_THOTD.ZIP / House of Dead.txt < prev    next >
Encoding:
Text File  |  1998-09-13  |  18.5 KB  |  371 lines

  1.  
  2. Free Information Xchange '98 presents:
  3.  
  4. The House of the Dead - CD crack by Static Vengeance - Sep 7, 1998
  5.  
  6. Requirements:
  7. Hex editor and full game install
  8. W32Dasm if you wish to follow along
  9.  
  10.     The House of the Dead (HOD) is a newer arcade shooter from Sega.  This game is more like Virtua
  11. Squad (1 & 2) then a Doom type first person shooter.  Although there is some ability to choose your paths
  12. most of the movement is predesigned into the game.  The game is fun to play if you like the "blood
  13. splattering shooter" type of games, which I do.  So I wanted a cracked version on my hard drive to play
  14. anytime I wanted to without having to dig out the original CD.
  15.     When I installed the game I started thinking about possible aproches to crack this one without
  16. even running it yet!  Right clicking on subdirectories and selecting properties from the context menu
  17. I started comparing the number of files and space required for each subdirectory that was copied to
  18. what was on the CD. One thing I noticed right away was that some key files are not copied to your hard
  19. drive.  Most notably the blood color .vmc files and a file called "bigger.vmc"  It's the bigger.vmc which
  20. is THE critcal file for the game, coming in at 52.6 megs.  So I copied all the files from g:\art\stage1\
  21. creature ("g" being my actual CD-Rom drive letter) to the same directory in the HOD game directory.  Now I
  22. have all the needed files on the hard drive.  Next I needed to modify the exe file to run completly of the
  23. hard drive and NOT require the CD to be in the CD-Rom drive.
  24.     To crack HOD, I used my favorite tools and my favorite method to track down CD rom checks. I loaded
  25. up W32Dasm from RUSoft and disassembled THOTD.exe.  Once W32Dasm had finished it's work, I went up to the
  26. menu bar and selected "refs" then "Data String References" from the drop down menu.  Once the string refs
  27. box popped up, I grabbed the slider bar and scrolled down looking for things of interest.  I found a string
  28. "A:\" which is commonly used in CD checks.  Starting with A:\ (or more often C:\), CD-Rom check routines
  29. will go down through the drives connected to your system looking for a CD-Rom drive.  Once these routines
  30. find a CD-Rom drive, they then start checking for specific files to make sure that the original game CD is
  31. in the drive.  Being a good place to start, I double clicked on it and W32Dasm put me in the middle of the
  32. following CD check routine:
  33.  
  34. * Referenced by a CALL at Address:
  35. |:004186AE                                            <-- Called once
  36. |
  37. :00411940 52                      push edx
  38. :00411941 89C2                    mov edx, eax
  39. :00411943 B88CBB5C00              mov eax, 005CBB8C
  40. :00411948 E81F000000              call 0041196C      <-- Call to actual CD check
  41. :0041194D 85C0                    test eax, eax
  42. :0041194F 7418                    je 00411969        <-- Taking this jump means failed
  43. :00411951 BA00020000              mov edx, 00000200
  44. :00411956 B89CBB5C00              mov eax, 005CBB9C
  45. :0041195B E800010000              call 00411A60
  46. :00411960 85C0                    test eax, eax
  47. :00411962 7405                    je 00411969
  48. :00411964 B801000000              mov eax, 00000001  <-- Set up for passed CD check
  49.  
  50. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  51. |:0041194F(C), :00411962(C)
  52. |
  53. :00411969 5A                      pop edx
  54. :0041196A C3                      ret                <-- Return to the caller
  55.  
  56. * Referenced by a CALL at Address:
  57. |:00411948                                           <-- Called from above
  58. |
  59. :0041196C 53                      push ebx
  60. :0041196D 51                      push ecx
  61. :0041196E 56                      push esi
  62. :0041196F 57                      push edi
  63. :00411970 55                      push ebp
  64. :00411971 81EC14010000            sub esp, 00000114
  65. :00411977 89842410010000          mov dword ptr [esp+00000110], eax
  66. :0041197E 89D5                    mov ebp, edx
  67. :00411980 8DBC2400010000          lea edi, dword ptr [esp+00000100]
  68.  
  69. * Possible StringData Ref from Code Obj ->"A:\"      <-- Start with drive A: and work down to CD drive
  70.                                   |
  71. :00411987 BE30194100              mov esi, 00411930
  72. :0041198C BB41000000              mov ebx, 00000041
  73. :00411991 A5                      movsd
  74. :00411992 A5                      movsd
  75. :00411993 A5                      movsd
  76. :00411994 A5                      movsd
  77.  
  78. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  79. |:00411A4A(C)
  80. |
  81. :00411995 8D842400010000          lea eax, dword ptr [esp+00000100]
  82. :0041199C 50                      push eax
  83. :0041199D 889C2404010000          mov byte ptr [esp+00000104], bl
  84.  
  85. * Reference To: KERNEL32.GetDriveTypeA, Ord:0005h        <-- Commonly used in CD checks
  86.                                   |
  87. :004119A4 2EFF1564023901          Call dword ptr cs:[01390264]
  88. :004119AB 83F805                  cmp eax, 00000005      <-- 05 is the value for a CD Rom drive
  89. :004119AE 0F8592000000            jne 00411A46           <-- Take this jump for non CD drives
  90. :004119B4 85ED                    test ebp, ebp
  91. :004119B6 745F                    je 00411A17
  92. :004119B8 55                      push ebp
  93. :004119B9 8D842404010000          lea eax, dword ptr [esp+00000104]
  94. :004119C0 50                      push eax
  95.  
  96. * Possible StringData Ref from Data Obj ->"%s%s"
  97.                                   |
  98. :004119C1 68D4005A00              push 005A00D4
  99. :004119C6 8D44240C                lea eax, dword ptr [esp+0C]
  100. :004119CA 50                      push eax
  101. :004119CB E80E2A1800              call 005943DE
  102. :004119D0 83C410                  add esp, 00000010
  103.  
  104. * Possible StringData Ref from Data Obj ->"rb"           <-- Read Binary call
  105.                                   |
  106. :004119D3 BADC005A00              mov edx, 005A00DC
  107. :004119D8 89E0                    mov eax, esp
  108. :004119DA E8472E1800              call 00594826
  109. :004119DF 85C0                    test eax, eax
  110. :004119E1 7463                    je 00411A46
  111. :004119E3 8DB42400010000          lea esi, dword ptr [esp+00000100]
  112. :004119EA 8BBC2410010000          mov edi, dword ptr [esp+00000110]
  113. :004119F1 E888221800              call 00593C7E
  114. :004119F6 57                      push edi
  115.  
  116. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  117. |:00411A0D(C)
  118. |
  119. :004119F7 8A06                    mov al, byte ptr [esi]
  120. :004119F9 8807                    mov byte ptr [edi], al
  121. :004119FB 3C00                    cmp al, 00
  122. :004119FD 7410                    je 00411A0F
  123. :004119FF 8A4601                  mov al, byte ptr [esi+01]
  124. :00411A02 83C602                  add esi, 00000002
  125. :00411A05 884701                  mov byte ptr [edi+01], al
  126. :00411A08 83C702                  add edi, 00000002
  127. :00411A0B 3C00                    cmp al, 00
  128. :00411A0D 75E8                    jne 004119F7
  129.  
  130. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  131. |:004119FD(C)
  132. |
  133. :00411A0F 5F                      pop edi
  134. :00411A10 B801000000              mov eax, 00000001              <-- Set up for a passed CD check
  135. :00411A15 EB3B                    jmp 00411A52                   <-- Jump down to the exit section
  136.  
  137. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  138. |:004119B6(C)
  139. |
  140. :00411A17 8DB42400010000          lea esi, dword ptr [esp+00000100]
  141. :00411A1E 8BBC2410010000          mov edi, dword ptr [esp+00000110]
  142. :00411A25 57                      push edi
  143.  
  144. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  145. |:00411A3C(C)
  146. |
  147. :00411A26 8A06                    mov al, byte ptr [esi]
  148. :00411A28 8807                    mov byte ptr [edi], al
  149. :00411A2A 3C00                    cmp al, 00
  150. :00411A2C 7410                    je 00411A3E
  151. :00411A2E 8A4601                  mov al, byte ptr [esi+01]
  152. :00411A31 83C602                  add esi, 00000002
  153. :00411A34 884701                  mov byte ptr [edi+01], al
  154. :00411A37 83C702                  add edi, 00000002
  155. :00411A3A 3C00                    cmp al, 00
  156. :00411A3C 75E8                    jne 00411A26
  157.  
  158. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  159. |:00411A2C(C)
  160. |
  161. :00411A3E 5F                      pop edi
  162. :00411A3F B801000000              mov eax, 00000001              <-- Set up for a passed CD check
  163. :00411A44 EB0C                    jmp 00411A52                   <-- Jump down to the exit section
  164.  
  165. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  166. |:004119AE(C), :004119E1(C)
  167. |
  168. :00411A46 43                      inc ebx                        <-- Increase the number of tries
  169. :00411A47 83FB5A                  cmp ebx, 0000005A              <-- Try up to 5A times
  170. :00411A4A 0F8E45FFFFFF            jle 00411995                   <-- Take this jump to keep trying
  171. :00411A50 31C0                    xor eax, eax                   <-- Else, set up for a failed CD check
  172.  
  173. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  174. |:00411A15(U), :00411A44(U)
  175. |
  176. :00411A52 81C414010000            add esp, 00000114              <-- Exit section of this routine
  177. :00411A58 5D                      pop ebp
  178. :00411A59 5F                      pop edi
  179. :00411A5A 5E                      pop esi
  180. :00411A5B 59                      pop ecx
  181. :00411A5C 5B                      pop ebx
  182. :00411A5D C3                      ret
  183.  
  184.     Well that's the code that actually tries to read the file (ART\STAGE1\CREATURE\bigger.vmc)
  185. off the CD, which is of course the CD check.  Well lets look at the code that surounds the caller to
  186. the above routine.  The code around 4186AE is as follows:
  187.  
  188.   --  Program code  --
  189. :0041869D B800040000              mov eax, 00000400
  190. :004186A2 E8A9A81400              call 00562F50
  191. :004186A7 31DB                    xor ebx, ebx
  192.  
  193. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  194. |:004186CD(C), :004186EF(U)
  195. |
  196. * Possible StringData Ref from Data Obj ->"ART\STAGE1\CREATURE\bigger.vmc"     <-- File to search CD for
  197.                                   |
  198. :004186A9 A15CE65C00              mov eax, dword ptr [005CE65C]
  199. :004186AE E88D92FFFF              call 00411940                  <-- Try to read file off the CD - CD check
  200. :004186B3 85C0                    test eax, eax                  <-- eax is flag  00=failed / 01=passed
  201. :004186B5 753A                    jne 004186F1                   <-- Take this jump to continue with game
  202.  
  203. * Possible StringData Ref from Data Obj ->"The House Of The Dead CD was not "  <-- Why we are doing this
  204.                                         ->"found."
  205.                                   |
  206. :004186B7 683C0D5A00              push 005A0D3C
  207. :004186BC 8B15244BC600            mov edx, dword ptr [00C64B24]
  208. :004186C2 52                      push edx
  209. :004186C3 E828B01400              call 005636F0
  210. :004186C8 83C408                  add esp, 00000008
  211. :004186CB 85C0                    test eax, eax
  212. :004186CD 75DA                    jne 004186A9
  213. :004186CF 66A1D4A5D500            mov ax, word ptr [00D5A5D4]
  214. :004186D5 50                      push eax
  215.  
  216. * Reference To: KERNEL32.GlobalDeleteAtom, Ord:000Bh
  217.                                   |
  218. :004186D6 2EFF157C023901          Call dword ptr cs:[0139027C]
  219. :004186DD 53                      push ebx
  220.  
  221. * Reference To: USER32.ClipCursor, Ord:0006h
  222.                                   |
  223. :004186DE 2EFF1520043901          Call dword ptr cs:[01390420]
  224. :004186E5 B801000000              mov eax, 00000001
  225. :004186EA E8A4B21400              call 00563993
  226. :004186EF EBB8                    jmp 004186A9
  227.  
  228. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  229. |:004186B5(C)
  230. |
  231. :004186F1 E8FE960000              call 00421DF4               <-- Getting here continues with the game
  232. :004186F6 E8B19AFFFF              call 004121AC
  233.  
  234. * Possible StringData Ref from Data Obj ->"rb"
  235.                                   |
  236. :004186FB BA800D5A00              mov edx, 005A0D80
  237.  
  238. * Possible StringData Ref from Data Obj ->"ART\STAGE1\CREATURE\texture.VMC"   <-- Need to load this file
  239.                                   |
  240. :00418700 A160E65C00              mov eax, dword ptr [005CE660]
  241. :00418705 E81CC11700              call 00594826
  242.   --  Continuing program code  --
  243.  
  244.     Changing the call 00411940 to mov eax, 00000001 will kill the call to the CD check and
  245. also force the jne 004186F1 (at 4186B5) to always be taken.  This is what you want if you always
  246. want to play the game without the CD.  Now, there are a few things I wanted to correct.  First,
  247. the cd_nocheck command line string should always be forced as well.  So scroll down the refs
  248. string box and double click on the cd_nocheck and W32Dasm will put you here:
  249.  
  250. * Possible StringData Ref from Data Obj ->"cd_nocheck"       <-- Ref string that got us here
  251.                                   |
  252. :0057A5F4 BA54B25C00              mov edx, 005CB254
  253. :0057A5F9 A13C4BC600              mov eax, dword ptr [00C64B3C]
  254. :0057A5FE E81D94FFFF              call 00573A20
  255. :0057A603 85C0                    test eax, eax
  256. :0057A605 7522                    jne 0057A629               <-- We'll force this jump to continue
  257. :0057A607 85DB                    test ebx, ebx
  258. :0057A609 7523                    jne 0057A62E
  259.  
  260. * Possible StringData Ref from Data Obj ->"The House Of The Dead CD Must "  <-- Never want to see this!
  261.                                         ->"be in to run."
  262.                                   |
  263. :0057A60B 6860B25C00              push 005CB260
  264. :0057A610 A1244BC600              mov eax, dword ptr [00C64B24]
  265. :0057A615 50                      push eax
  266. :0057A616 E84591FEFF              call 00563760
  267. :0057A61B 83C408                  add esp, 00000008
  268. :0057A61E 85C0                    test eax, eax
  269. :0057A620 750C                    jne 0057A62E
  270. :0057A622 E87989FEFF              call 00562FA0
  271. :0057A627 EB05                    jmp 0057A62E
  272.  
  273. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  274. |:0057A605(C)
  275. |
  276. :0057A629 BB01000000              mov ebx, 00000001         <-- Get here to activate "cd_nocheck"
  277.  
  278. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  279. |:0057A609(C), :0057A620(C), :0057A627(U)
  280. |
  281. :0057A62E 85DB                    test ebx, ebx
  282. :0057A630 0F840AFFFFFF            je 0057A540
  283. :0057A636 8D65EC                  lea esp, dword ptr [ebp-14]
  284. :0057A639 5F                      pop edi
  285. :0057A63A 5E                      pop esi
  286. :0057A63B 5A                      pop edx
  287. :0057A63C 59                      pop ecx
  288. :0057A63D 5B                      pop ebx
  289. :0057A63E 5D                      pop ebp
  290. :0057A63F C3                      ret
  291.  
  292.     Alright, just change the conditional jump (75 xx) at 57A605 to a non-conditional jump (EB xx).
  293. This will force the cd_nocheck switch to always be active, eliminating the last portion of the copy
  294. protection.  What was the purpose of this switch anyways?  Without the switch active and even WITH
  295. the CD in the drive the game comes up and says "The House Of The Dead CD Must be in to run."  It's
  296. a waste of code when you cannot load the entire game on the hard drive.
  297.     Next up, I wanted to force the game to always use Direct3D so I checked for a reference to
  298. d3d and didn't find one.  However I did find a ref to ddraw.  I figured that if I couldn't find d3d
  299. it would be in the section that forced plain DirectDraw.  Double clicking on ddraw from the ref's
  300. box I played around a bit.
  301.  
  302. * Possible StringData Ref from Data Obj ->"ddraw"         <-- The ref string that got us here
  303.                                   |
  304. :005634AF BA806E5C00              mov edx, 005C6E80       <-- Actual pointer to ddraw
  305. :005634B4 A13C4BC600              mov eax, dword ptr [00C64B3C]
  306. :005634B9 E862050100              call 00573A20           <-- Check if switch was active
  307. :005634BE 85C0                    test eax, eax
  308. :005634C0 751A                    jne 005634DC            <-- Take this jump if it was active
  309. :005634C2 BA886E5C00              mov edx, 005C6E88       <-- Pointer to string D3D, I think
  310. :005634C7 A13C4BC600              mov eax, dword ptr [00C64B3C]
  311. :005634CC E84F050100              call 00573A20
  312. :005634D1 85C0                    test eax, eax
  313. :005634D3 7407                    je 005634DC             <-- Take this jump if D3D NOT active
  314. :005634D5 E8C6070100              call 00573CA0           <-- Set game for Direct3D device
  315. :005634DA EB05                    jmp 005634E1
  316.  
  317. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  318. |:005634C0(C), :005634D3(C)
  319. |
  320. :005634DC E88F290000              call 00565E70
  321.  
  322. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  323. |:005634DA(U)                                             <-- Continue with the game
  324. |
  325. * Possible StringData Ref from Data Obj ->"AppIcon"
  326.                                   |
  327. :005634E1 688C6E5C00              push 005C6E8C
  328. :005634E6 BB60315600              mov ebx, 00563160
  329. :005634EB 8B35204BC600            mov esi, dword ptr [00C64B20]
  330. :005634F1 31C9                    xor ecx, ecx
  331. :005634F3 56                      push esi
  332. :005634F4 31FF                    xor edi, edi
  333. :005634F6 894DE4                  mov dword ptr [ebp-1C], ecx
  334.  
  335.     Eventually I found if the game takes the call to 573CA0 (at 5634D5) it will use your Direct3D
  336. device.  So I changed the mov edx, 005C6E80 to 3 NOP's and a jump down to 5634D5 so the game always uses
  337. D3D for the graphics.  If you wanted to force DirectDraw, then you don't need to do anything.  That wraps
  338. up everything I wanted to do with the game as far as cracking it and "customizing" it.  Now you can
  339. simply run the THOTD.exe without any command line switches active and still not need the CD online and
  340. always get the D3D version to run. The steps needed to crack The House of the Dead are as follows:
  341.  
  342. 1.  Install the game to your hard drive
  343. 2.  Copy all files from x:\art\stage1\creature\ to the same directory in HOD game directory
  344.     (where "x" is your actual CD-Rom drive letter)
  345. 3.  Copy Wgamecfg.exe from root of the game CD to the HOD game directory
  346. 4.  Make the following edits:
  347.  
  348. Edit THOTD.EXE
  349. ================================================
  350. Search for: E8 8D 92 FF FF  at offset  35,502
  351. Change to : B8 01 00 00 00
  352.  
  353. Search for: 85 C0 75 22     at offset 1,485,315
  354. Change to : -- -- EB --
  355.  
  356.  -- Optional to force D3D all the time --
  357.  
  358. Search for: BA 80 6E 5C 00  at offset 1,390,767
  359. Change to : 90 90 90 EB 21
  360.  
  361.     There you have it, The House of the Dead is now FiX'ed and can be run from the hard drive.  As a
  362. benefit of the above process, you can now change the color of blood as well all right from your HD.
  363.  
  364. Static Vengeance
  365.  
  366. Cheat Codes:  At Main Menu hold CTRL and type:
  367.  
  368. SKIDMARX  To enable Cheat and Edit Stats
  369. CREATURE  To enable Creature Test
  370.  
  371.